home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil03.TXT < prev    next >
Text File  |  1993-09-01  |  12KB  |  253 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  3.Teil...
  4.  
  5. So, nachdem wir mal etwas sinnvolles gemacht haben, geht es mit neuem
  6. schwung weiter..
  7. Wollen wir mal bei periodisch ablaufenden vorgaengen weitermachen, und zwar
  8. wollen wir mal die Powerled blinken lassen, solange bis die Maustaste
  9. gedrueckt wird.
  10. Wie man die Maustaste abfragt wissen wir ja schon, an und aus der Lampe
  11. kennen wir ja schon...also
  12.  
  13. Ich zeige euch noch zwei sachen die man bei allen SourceCodes benutzen
  14. sollte...
  15.  
  16.  
  17. CIAapra = $BFE001               ; So kann man Labels auch benutzen
  18.                                 ; Ueberall wo dieses CIAapra auftaucht
  19.                                 ; setzt der Seka $BFE001 ein
  20.  
  21.  
  22. Start:                          ; Label bei Start des programms, erklaere
  23.                                 ; ich gleich !
  24.         Bchg #1,CIAapra         ; Bit umdrehen
  25.         Btst #6,CIAapra         ; Bit testen
  26.         Bne.s Start             ; Nicht gedrueckt ? Von Vorn
  27.         Rts                     ; Raus ->
  28.  
  29. So die Funktion muesste eigentlich klar sein, nur das mit den Labels
  30. vielleicht nicht.
  31. Ein Definiertes Label hat immer ein Wert in sich, es kommt aber auf die
  32. Definitionsart an. Die erste Defi... , dieses CIAapra = $BFE001 gibt dem
  33. label CIAapra den Wert $BFE001, ueberall wo dieses Wort auftaucht setzt der
  34. Assembler den Wert ein. Die andere Art und weise ist die mit dem
  35. Doppelpunkt mitten im Listing. Dabei nimmt das label den Wert des PC an.
  36. Dies ist sehr sinnvoll, 1.Weil wir uns die Woerter leichter merken koennen,
  37. und zweitens weil wir nicht wissen wo der Seka das programm hinschreibt,
  38. also koennten wir nie sagen wie die Adresse heisst, 3.Muessten wir jedesmal
  39. die Differenz fuer den Bne befehl neu ausrechnen wenn wir noch etwas dazu
  40. programmieren.
  41. Also leute, benutzt Label wo es nur geht, bei dem einem wert kommt es noch
  42. nicht sinnvoll vor, aber wartet mal bis wir anfangen Bilder anzuschalten
  43. und so, da geht es ab mit Adressen, und da ist es besser man hat ein Wort
  44. das man einprogrammieren lkann, was sich so anhoert wie das was wir machen
  45. wollen.
  46.  
  47. Habt ihr das Programm eigentlich schon abgetippt und gestartet...nehh, dann
  48. macht das mal.
  49. Es gibt jetzt zwei moeglichkeiten, entweder seht ihr die lampe einwenig
  50. oder noch weniger Flackern, ihr muesst aber genau hingucken, dann seht ihr
  51. es.
  52. Woran liegt das, das man das nicht sieht, hmmmmh. Erinnern wir uns mal
  53. daran wie schnell der MC 68000 ist, und jetzt gucken wir uns mal das
  54. listing an, und gehen es mal in gedanken durch ...lampe aus, maustest,
  55. lampe an, maustest, lampe aus....
  56. Tja, das ist alles, und das macht er natuerlich sehr schnell, also muessen
  57. wir den Amiga bremsen..wie koennte man das machen. Wir Menschen benutzen
  58. diese methode auch, wenn wir Musizieren, naehmlich die Takte, wenn wir zb.
  59. im 1/4 takt spielen machen wir es so, Trommelschlag 2  3  4
  60. Trommelschlag 2  3  4
  61. Genau so machen wir es jetzt mit dem Amiga, wir lassen ihn zwischendurch
  62. etwas Zaehlen.
  63. Wie koennten wir das realisieren, nun den Move befehl kennen wir um einen
  64. wert zu schreiben, wir koennten diesen wert einfach bis auf Null
  65. runterzaehlen, und mit Bne das ende abfragen, ganz einfach machen wir das
  66. doch....
  67.  
  68. CIAapra = $BFE001
  69. Counter = $ffff
  70.  
  71. Start:      Bchg   #1,CIAapra
  72.  
  73.             Move.l Counter,d0
  74. Schleife:   Sub.l  #1,d0
  75.             Bne.s  Schleife
  76.  
  77.             Btst   #6,CIAapra
  78.             Bne.s  Start
  79.             Rts
  80.  
  81. So, das mit dem Zaehlen duerfte kein problemm sein, ihr kent ja alle
  82. befehle, die benutzt werden.
  83. Damit ihr nicht durch`s ganze listing fahren muesst, habe ich den Zaehl
  84. wert im Label Counter unterbracht.
  85. So, wenn ihr das jetzt startet koennt ihr mal ein Bisschen sehen wie
  86. schnell der kleine kasten vor euch ist, er macht die lampe aus, zaehlt bis
  87. 65535 und macht sie dann wieder an, zaehlt bis 65535....
  88.  
  89. Schnell is er ja, ihr koennt jetzt ein bisschen mit dem Werten
  90. rumprobieren, allerdings $ffffffff wuerde ich nicht eingeben, den es dauert
  91. sehr lange...
  92.  
  93. Hmmmmh, warteschleifen kennt ihr jetzt...so, dann werde ich mit euch jetzt
  94. etwas machen, was nicht so funktionieren wird wie man sich es denkt, und
  95. dann werden wir uns dem 1.Special Chip im Amiga widmen. Ich weiss, es
  96. scheint was zu frueh, aber glaubt mir, es lohnt sich das Teil von Anfang an
  97. zu beherrschen, denn ohne den Copper ! geht nicht viel im Amiga, was mit
  98. grafik und so zu tun hat....
  99.  
  100. Also wollen wir mal versuchen, die Bildschirm Farbe zu aendern..
  101. Die Leute die das Intern-Buch I haben, haben es gut sie koennen jetzt die
  102. seite mit den Registern aufschlagen, und nach Color00 suchen, die Leute die
  103. das nicht haben, muessen mir Glauben das es bei $DFF180 liegt.
  104.  
  105. Um die Bildschirm farbe zu aendern, muessten wir Theoretisch nur einen
  106. anderen wert als wie den der jetzt da drin steht.
  107.  
  108. Also....
  109.  
  110. Color00 = $DFF180
  111.  
  112. Start:  Move.w #$0fb0,Color00    ;$0fb0 = farb wert fuer Gold
  113.         Rts
  114.  
  115. muesste dann eigentlich reichen.
  116. Naja starten wir es doch mal....hmmmh, blitzt nur kurz auf der bildschirm..
  117. Komisch was koennte das sein, muesen wir halt ein Endlos programm mit
  118. Maustest schreiben...
  119.  
  120. Color00 = $DFF180
  121. CIAapra = $BFE001
  122.  
  123. Start:  Move.w #$0fb0,Color00
  124.         Btst #6,CIAapra
  125.         Bne.s Start
  126.         Rts
  127.  
  128. Tja, das Flackert immer noch, komisch...naja, um das zu erklaeren muss ich
  129. etwas mehr ausholen, also
  130.  
  131. 5. Der Coprozessor Copper
  132.  
  133. So, der Copper...nun wie soll ich anfangen..
  134. Zuerst einmal ist es der Wichtigtse Chip im Amiga...ach Quatsch alle sind
  135. wichtig, am besten ich sage was er macht.
  136. Nun er setzt farben zum richtigen zeitpunkt, verwaltet die Bildschirme,
  137. gibt Sprites ihr Positions, kurz er kann fast alles machen, was mit grafik
  138. uns so zutun. Dass heisst er kann alle Register des Amigas benutzen, also
  139. beschreiben, und da hat er einen Ganze menge moeglichkeiten, und dazu noch
  140. zu ganz bestimmten festlegbaren zeiten.
  141. Er kann zum beispiel ganz einfach, in der mitte des bildschirm eine andere
  142. farbe darstellen, und zwei zeilen spaeter wieder auf die alte farben
  143. umstellen, er kann unter gewissen umstaenden jeden Pixel auf dem
  144. Bildschirm abfragen. Nun, wie er das macht, dazu geht es in die Struktur
  145. des Amiga.
  146. Die tollen Moeglichkeiten des Amigas ruehren daher das er nicht alles was
  147. er macht, alleine machen muss, er kann viele Sachen von den SpecialChips um
  148. ihn herum erledigen lassen, er muss ihnen nur noch sagen wo, und wann.
  149. Dazu ist es aber noetig das sich die Chip der sogenannten DMA technik
  150. bedienen, das heisst um effektiv arbeiten zu wollen muessen die einzelnen
  151. Chips zugriff auf den Ramspeicher haben, dieses geht aber nur in gewissen
  152. grenzen, naemlich im Chipram, dem Festeingebauten speicher den man von
  153. anfang an hat. Das ist zwar eine einschraenkung, stoert uns aber weiter
  154. nicht.
  155. Beim Copper sieht es so aus, das er wenn der Bildschirm aufgebaut wird ein
  156. ganz bestimmtes programm durch geht, in dem Steht was er wann zu machen
  157. hat, wann der bildschirm schwarz wird, wann ein neuer bildschirm kommt.
  158. zb. Das rauf und runterziehen der AmigaScreens waere ohne den copper nicht
  159. moeglich, denn er ist sauschnell, das ruehrt daher das er nicht auf andere
  160. warten muss, und das er nur drei befehle hat, von denen uns aber erstmal
  161. nur zwei interressieren. Naemlich Move und Wait
  162.  
  163. Der Move befehl des Coppers ist verwandt mit dem des MC 68000, es gibt ihn
  164. aber nur in einer Version, der Direkten.
  165. Mit dem Wait befehl, kann man auf jede beliebige position auf dem
  166. Bildschirm warten, um dann eine ganz bestimmte sache durchzufuehren.
  167.  
  168. Um dem Copper also fuer unsere zwecke arbeiten zu lassen, muessen wir im
  169. ein solches programm schreiben, man nennt es Copperliste, und es im dann
  170. nur noch uebergeben, dann wird er es abarbeiten. Wenn wir das programm
  171. verlassen muessen wir ihm allerdings die alte copperliste die er benutzt
  172. wenn er im CLI oder wo auch immer ist, zurueckgeben, da er sonst unsere
  173. alte weiter abarbeitet, und wir wuerden nichts sehen.
  174.  
  175. Desweiteren muessen wir auch noch einen schritt gehen den die meisten
  176. profisionellen Programmierer nur in absoluten Notfaellen gehen.
  177. Naemlich, dem Amiga die Kontrolle entziehen, das heisst Multitasking
  178. abschalten, und alle interrupts verbieten. das hat folgenden Sinn, der
  179. Amiga Pfuscht uns jetzt nicht mehr rein, egal was wir jetzt machen, aber
  180. auch diesen Zustand muessen wir bei verlassen wieder in den Ausgangs-
  181. Zustand bringen.
  182.  
  183. Bei der Copperprogrammierung muessen wir aber auch auf Funktionen
  184. Zurueckgreifen, die nur der Amiga selbst kann, das heisst, ein programm zu
  185. schreiben das das Multitasking abschaltet wuerde unheimlich lange dauern,
  186. und wuerde nur aufhalten, also warum das Rad neu erfinden, wenn der Amiga
  187. schon eine Solche Routine schon da ist. Genauso verhaelt es sich mit der
  188. Adresse 1.Copperliste, die der Amiga fuers CLI errechnet hat, die register
  189. wo das drin steht koennen wir nicht auslesen, aber zum Glueck kann der
  190. Amiga sich die auslesen, und merkt sich die an einer ganz bestimmten
  191. stelle.
  192.  
  193. Das geheimnis sind die Library`s des Amiga. Jeder von euch hat bestimmt
  194. schon mal davon gehoert, aber weis nicht ganz genau was es damit auf sich
  195. hat.
  196.  
  197. Nun....
  198.  
  199. 6.Oeffnen und benutzen von Library`s
  200.  
  201. Library`s sind zu deutsch Bibliotheken, und zwar voll von kleinen oder
  202. groesseren programmen die der Amiga, so im Taeglichen alltag braucht.
  203. Durch die offene Struktur des Amigas koennen wir diese tolle sachen
  204. mitbenutzen. Tja, mit den tollen sachen, ist das aber eine sache, es gibt
  205. fuer alles irgendwelchen routinen, aber sie sind alle in C der sprache des
  206. Amigas programmiert, ich persoenlich habe nichts gegen C, aber es ist
  207. einfach zu langsam, nicht fuer alles, aber sobald es um grafik und alles
  208. was mit echtzeit zu tun hat da muss man es schnell vergessen.
  209. Natuerlich funktionen die man nur einmal in Situation aufruft in denen es
  210. nicht so auf zeit ankommt kann man die library`s ruhig benutzen.
  211.  
  212. Uns interressieren jetzt erstmal nur 2 library`s naemlich die Exec und die
  213. Graphics library.
  214.  
  215. Um Libraryfunktionen zu benutzen muess man erstmal die library oeffen, dazu
  216. dient eine Funktion der Exec-Library, naemlich Openlibrary, sie oeffnet die
  217. Library die man will.
  218. Moment, wie soll ich den daran kommen, wenn ich die Library`s erst oeffnen
  219. muss, und der Oeffne -befehl in einer Library ist.
  220. Das habe sich die Programmieren wohl auch ueberlegt, und deshalb ist die
  221. Exec-library auch immer offen, deshalb ist der zugriif auf funktionen
  222. daraus ziemlich einfach. Man muss nur wissen, wo die Position der funktion
  223. in der library ist, und man muss wissen wo die Library liegt.
  224. Also bei der Execbase ist es so das die Adresse in der Speicher stelle
  225. $00000004 liegt. Zu dieser adresse muss man dann nur noch den `Offset` der
  226. gewuenschten Funktion zaehlen, und schon kann man sie aufrufen. Ich
  227. schreibe mal ein programm was Multitasking abschaltet, und dann wieder
  228. anschaltet, die beiden Funktionen heissen Forbid und Permit
  229.  
  230. CIAapra = $BFE001
  231. Forbid  = -132          ;Offsets der funktionen
  232. Permit  = -138
  233. Execbase = 4            ;in 4 liegt die Basis der Execlibrary
  234.  
  235.  
  236. Start:  Move.l Execbase,a6
  237.         Jsr Forbid(a6)
  238. Wait:   Btst #6,CIAapra
  239.         Bne.s Wait
  240.         Jsr Permit(a6)
  241.         Rts
  242.  
  243. So, dieses Programm schaltet erstmal das Multitasking aus, wartet auf die
  244. maus, und schaltet es dann wieder an. Ihr braucht es nicht abzutippen, denn
  245. man sieht sowieso nichts.
  246. Natuerlich muss man manchen sachen auch noch etwas auf den Weg geben, damit
  247. die funktion weiss was sie machen muss, zum beispiel die Openlibrary
  248. funktion, sie muss ja wissen welche Library sie denn oeffnen soll...
  249.  
  250. Aber dazu im 4.Teil mehr
  251.  
  252.                 Jeff Kandle
  253.